不要被標題一堆名詞嚇到;當你用過它後,你會驚訝它的易用以及,最重要的,無縫接軌辨識人臉關鍵點
Dlib
套件,一個你可能覺得陌生,但在聽到Facial Landmark或是Face Alignment時,卻幾乎一定會用到的強大套件。
以我自己在進行Computer Vision相關功能或專案時,下面幾個套件一定是先裝好裝滿:
再來才會看要做哪一種影像分析,或是訓練模型... (訓練模型的圖片預處理有其他方便的工具,如keras
、scikit-learn
等)
當你了解如何使用基本工具 (OpenCV & Dlib)來進行人臉分析後,FaceNet、VGGFace、DeepFace等等這些人臉識別模型的使用才會更得心應手。
前面提到過,使用OpenCV & Dlib來做人臉偵測,大概可以分為四種方式:
今天說這個
今天要介紹第三種方式。
習慣上我喜歡稱呼這個方法叫Dlib特徵檢測
,其實從名稱其實可以看出一二,
Dlib HOG + Linear SVM與OpenCV Haar cascades其實都是透過檢測(滑動視窗)的特徵來辨識物體與位置
今天介紹的方法其背後原理大概可以分成兩步驟:
最終訓練出來的模型就是我們今天要使用的方法。
在辨識準確度上相比,Dlib特徵檢測
要比哈爾特徵檢測
高,也不太需要調整參數來提高辨識度。
話不多說,Let's code!
face_detection
目錄下新增一個Python檔案dlib_hog_svm.py# 匯入必要套件
import time
import cv2
import dlib
import imutils
import numpy as np
from imutils.face_utils import rect_to_bb
from imutils.video import WebcamVideoStream
# 初始化模型
detector = dlib.get_frontal_face_detector()
# 定義人臉偵測函數方便重複使用
def detect(img):
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 偵測人臉,將辨識結果轉為(x, y, w, h)的bounding box
results = detector(rgb, 0)
rects = [rect_to_bb(rect) for rect in results]
return rects
def main():
# 啟動WebCam
vs = WebcamVideoStream().start()
time.sleep(2.0)
start = time.time()
fps = vs.stream.get(cv2.CAP_PROP_FPS)
print("Frames per second using cv2.CAP_PROP_FPS : {0}".format(fps))
while True:
# 取得當前的frame,變更比例為寬300,並且轉成RGB圖片
frame = vs.read()
img = frame.copy()
img = imutils.resize(img, width=300)
# 取得frame的大小(高,寬)
ratio = frame.shape[1] / img.shape[1]
# 呼叫偵測函數,取得結果
rects = detect(img)
# loop所有預測結果
for rect in rects:
# 計算bounding box(邊界框)與準確率 - 取得(左上X,左上Y,右下X,右下Y)的值 (記得轉換回原始frame的大小)
box = np.array(rect) * ratio
(x, y, w, h) = box.astype("int")
# 畫出邊界框
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 標示FPS
end = time.time()
cv2.putText(frame, f"FPS: {str(int(1 / (end - start)))}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7,
(0, 0, 255), 2)
start = end
# 顯示影像
cv2.imshow("Frame", frame)
# 判斷是否案下"q";跳離迴圈
key = cv2.waitKey(1) & 0xff
if key == ord('q'):
break
if __name__ == '__main__':
main()
python face_detection/dlib_hog_svm.py
,跑出來的範例結果會是這樣:get_frontal_face_detector
函數名稱就可以看出來了,這個功能對正面臉的準確度比較好detector(rgb, 0)
中的第二個參數:
參考程式碼在這
好了,今天就到這邊,
對程式碼有疑問的歡迎留言囉。
不過我用這個也會有超出的問題xd
但我dlib是19.22.1版的
https://drive.google.com/file/d/1lJX8KfGEvn93ZeAzUzrdNn-UNzvPBw6F/view?usp=sharing
這給您參考看看,範圍正常時是黑框,超過範圍變紅框
感謝分享~